import notification from 'ant-design-vue/es/notification'
export class dsWebSocket {
  constructor (params) {
    this.baseUrl = window.PROJECT_CONFIG.VUE_APP_SOCKET_API_BASE_URL
    this.params = params
    this.wesock = null // 建立的连接
    this.lockReconnect = false // 是否真正的建立连接
    this.timeout = 10 * 1000 // n秒一次的心跳
    this.timeoutObj = null // 心跳倒计时
    this.serverTimeoutObj = null // 心跳倒计时
    this.timeoutnum = null // 断开 重连倒计时
    if ('WebSocket' in window) {
      this.init(params)
    } else {
      notification.error({
        message: '浏览器不支持，请换浏览器再试',
        type: 'error'
      })
    }
  }

  /**
   * @desc 初始化
   * @return
   * @author ppc
   */
  init (params) {
    //建立连接
    this.websock = new WebSocket(this.baseUrl + params.path)
    // 连接成功
    this.websock.onopen = this.onOpen.bind(this)
    //连接错误
    this.websock.onerror = this.onError.bind(this)
    //接收信息
    this.websock.onmessage = this.getInformation.bind(this)

    //连接关闭
    this.websock.onclose = function() {
    }
    this.websock.onclose = this.close.bind(this)
  }

  /**
   * @desc 重新连接
   * @return
   * @author ppc
   */
  reconnect () {
    if (this.lockReconnect) {
      return
    }
    this.lockReconnect = true
    //没连接上会一直重连，设置延迟避免请求过多
    this.timeoutnum && clearTimeout(this.timeoutnum)
    this.timeoutnum = setTimeout(function() {
      //新连接
      // this.init()
      this.lockReconnect = false
    }, 5000)
  }

  /**
   * @desc 重置心跳
   * @return
   * @author ppc
   */
  reset () {
    console.log('this', this)

    //清除时间
    clearTimeout(this.timeoutObj)
    clearTimeout(this.serverTimeoutObj)

    //重启心跳
    // console.log('-----重启心跳------')
    // this.start()
  }

  /**
   * @desc 开启心跳
   * @return
   * @author ppc
   */
  start () {
    this.timeoutObj && clearTimeout(this.timeoutObj)
    this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj)
    this.timeoutObj = setTimeout(() => {
      //这里发送一个心跳，后端收到后，返回一个心跳消息，
      if (this.websock && this.websock.readyState == 1) {
        // console.log(222222)
        //如果连接正常
        this.websock.send('{"wsRequestType":"HEARTBEAT"}')
        // console.log("发送消息");
      } else {
        //否则重连
        // console.log("重新链接")
        this.reconnect()
      }
      this.serverTimeoutObj = setTimeout(() => {
        //超时关闭
        this.websock.close()
      }, this.timeout)
    }, this.timeout)
  }

  /**
   * @desc 连接成功
   * @return
   * @author ppc
   */
  onOpen () {
    //提示成功
    // this.isOnline = 1;
    //开启心跳
    console.log('-----连接成功------')
    this.start()
  }

  /**
   * @desc 连接失败
   * @return
   * @author ppc
   */
  onError () {
    // console.log("WebSocket连接发生错误");
    // this.isOnline = 2;
    //重连
    this.reconnect()
  }

  /**
   * @desc 连接关闭事件
   * @return
   * @author ppc
   */
  close () {
    // this.reconnect();
  }

  /**
   * @desc 接收服务器推送的信息
   * @return
   * @author ppc
   */
  getInformation (event) {
    //收到服务器信息，心跳重置
    // this.reset()
    if (event.data === 'connected successfully') {
      return []
    }
    const redata = event.data ? JSON.parse(event.data) : []
    this.params.onmessage(redata)
    return redata
  }

  /**
   * @desc 向服务器发送信息
   * @return
   * @author ppc
   */
  send () {

  }
}
